'''
@Author: ysz
@Date: 2019-12-27 09:14:36
@LastEditors  : ysz
@LastEditTime : 2020-01-09 12:22:18
@Description: 租房和二手房公有的部分
'''

import html
import requests
import re
import os.path
import os
import time
import datetime
import random
from lxml import etree


from user_agent_help import User_Agent_Help

#实例化解码类的对象
uahelp=User_Agent_Help()


class TongCheng(object):

    def __init__(self,url,headers):
        '''
        @description: 初始化方法
        @param1: {
        *      self:"当前对象",
        *      url:"起始url",
        *      headers:"模拟头部信息",
        *      }
        @return: 无
        @detail:初始化对象，并为当前对象添加属性和赋值
        '''
        self.url=url
        self.headers=headers
            
    #获取所有的列表页的url
    def all_page_list(self,url):
        
        '''
        @description: 爬取所有的列表页
        @param1: {
        *      self:"当前对象 ",
        *      url:"列表页的url",
        *      }
        @return: 递归循环所有的列表页
        @detail: 根据起始的列表页的url，爬取出列表页的url，进入列表页，爬取详情页的url；
                 如果这一个页面中有下一页的字迹，继续以上步骤循环爬取，直到没有这一字迹为止。
        '''
        print(self.url,'列表页的地址')
        #获取当前列表页的页面内容
        response=requests.get(url=url,headers=self.headers)
        page_html=etree.HTML(response.text)
        
        time.sleep(random.randint(60,120))
        self.page_list(url,self.headers['referer'])
        #判断有没有下一页的列表页，如果有就说明还存在列表页，继续爬取数据
        if '下一页' in page_html.xpath('//div[@class="pager"]/a/span/text()'):
            next_page=page_html.xpath('//div[@class="pager"]/a[@class="next"]/@href')[0]
            if not 'https://sy.58.com/'  in next_page:
                next_page='https://sy.58.com/'+next_page
            self.headers['User-Agent']=uahelp.get_useragent()
            return self.all_page_list(next_page)


    # ----获取列表页中关于详情页的url
    def page_list(self,url,referer):
        '''
        @description: 从列表中获取详情页的url
        @param1: {
        *      self:"当前对象",
        *      url:"列表页的url",
        *      referer:"从何处找寻到这个url的",
        *      }
        @return: 返回列表页的内容
        @detail: 根据url向服务器发送请求，服务器返回相应结果
        '''
        headers={
            'User-Agent':self.headers['User-Agent'],
            'cookie':self.headers['cookie'],
            'referer':referer,
        }
        #获取当前列表页中页面信息
        response=requests.get(url,headers=headers)
        #将当前列表页中页面内容转换成etree.HTML格式
        list_html=etree.HTML(response.text)

        return list_html

        
    #爬取详情页的数据
    def one_detail_page(self,url,referer):
        assert(0)
      

    # 下载图片
    # def down_img_pic(self,img_url,referer,house_type):
    #     '''
    #     @description: 下载图片到本地
    #     @param1: {
    #     *      self:"当前对象",
    #     *      img_url:"图片的url",
    #     *      referer:"这个图片的房源url",
    #     *      house_type:"房屋类型--租房/二手房，区分文件夹",
    #     *      }
    #     @return: 图片地址
    #     @detail: 根据图片的url，下载图片，图片名还是原来的名字
    #     '''        

    #     headers={
    #         'referer':referer,
    #         'User-Agent':self.headers['User-Agent'],
    #     }
    #     response=requests.get(img_url,headers=headers)
    #     filename=img_url.split('?')[0].split('/')[-1]
    #     dir_name=str(datetime.datetime.now()).split(' ')[0].replace('-','')
    #     if not os.path.exists('./download/'+house_type+'/'):
    #         os.mkdir('./download/'+house_type+'/')
    #     if not os.path.exists('./download/'+house_type+'/'+dir_name):
    #         os.mkdir('./download/'+house_type+'/'+dir_name)
    #     with open(f'./download/{house_type}/{dir_name}/{filename}','wb') as fp:
    #         fp.write(response.content)
    #     pic_path='/download/'+house_type+'/'+dir_name+'/'+filename
    #     return pic_path


    def judge_scope(self,floor,total_floor):
        '''
        @description: 判断大概是第几层
        @param1: {
        *      self:"当前对象",
        *      floor:"中层/高层/底层",
        *      total_floor:"总层数",
        *      }
        @return: 大概的楼层数
        @detail: 
        '''
        medium=int(total_floor/3)
        if floor=='高层':
            floor=random.randrange(1+medium*2,total_floor+1)
        elif floor=='中层':
            floor=random.randrange(1+medium*1,1+medium*2+1)
        else:
            floor=random.randrange(1,1+medium*1+1)
        return floor

    def run(self):
        self.all_page_list(self.url)
    
# 代码的入口
if __name__ == "__main__":
    path='./download'
    if not os.path.exists(path):
        os.mkdir(path)
    url='https://sy.58.com/huanggu/ershoufang/0/pn1/'
    headers={}
    mycommon=TongCheng(url,headers)
    mycommon.run()
   
    





